﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.Eventos;
using Entidades.Eventos;

public partial class Eventos_frmModificarReserva : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        verContrato.ServerClick += new EventHandler(verContrato_ServerClick);
        btnCancelar.ServerClick += new EventHandler(btnCancelar_ServerClick);
        //btnGuardar.ServerClick += new EventHandler(btnGuardar_ServerClick);
        calcular.ServerClick += new EventHandler(calcular_ServerClick);

        List<EveReserva> eveReservaList = new List<EveReserva>();
        if (Session["listaReservasEncontradas"] != null)
            eveReservaList = (List<EveReserva>)Session["listaReservasEncontradas"];

        int idReserva = Convert.ToInt32(Request.QueryString["idReserva"]); //2;

        EveReserva reservaSeleccionada = eveReservaList.Where(r => r.idReserva == idReserva).FirstOrDefault();

        if (!Page.IsPostBack)
        {
            asistentes.Items.Clear();
            for (int i = 2; i <= 30; i++)
            {
                asistentes.Items.Add(i.ToString());
            }


            List<GenLocal> genLocalList = GenLocalBLL.listar();
            List<ListItem> listListItem = genLocalList.Select(lo => new ListItem { Value = lo.iDLocal.ToString(), Text = lo.nombre }).ToList();

            selectLocal.Items.Clear();
            foreach (ListItem listItem in listListItem)
                selectLocal.Items.Add(listItem);

            if (reservaSeleccionada != null)
            {
                Session["reservaSeleccionada"] = reservaSeleccionada;
                Session["eventoSeleccionado"] = reservaSeleccionada.Eve_Evento;
                Session["clienteSeleccionado"] = reservaSeleccionada.Gen_Cliente;
                fillClientInformation(reservaSeleccionada.Gen_Cliente);
                fillEventoInformation(reservaSeleccionada.Eve_Evento, reservaSeleccionada);
            }
        }

        fillProductsInformation(reservaSeleccionada);
    }

    void calcular_ServerClick(object sender, EventArgs e)
    {
        persistirDatosEvento();

        double montoTotal = 0;
        foreach (TableRow tr in tablaProductos.Controls)
        {
            foreach (TableCell tc in tr.Controls)
            {

                if (tc.ID != null && tc.ID.Contains("subtotaltc"))
                {
                    ControlCollection controles = tc.Controls;
                    if (controles.Count > 0)
                    {
                        if (tc.Controls[0] is Label)
                        {
                            Label label = (Label)tc.Controls[0];
                            montoTotal = montoTotal + Convert.ToDouble(label.Text);
                        }
                    }
                }
            }
        }
        total.Value = montoTotal.ToString("0.00");
    }

    void btnCancelar_ServerClick(object sender, EventArgs e)
    {
        //Session.RemoveAll();
        Response.Redirect("frmGestionarReserva.aspx");
    }

    void verContrato_ServerClick(object sender, EventArgs e)
    {
        if (estado.Value == "1")
        {
            ClientScript.RegisterStartupScript(this.GetType(), "newWindow", String.Format("<script>window.open('{0}');</script>", "frmGenerarContrato.aspx"));
        }
        else
        {
            EveReserva newReserva = new EveReserva();

            newReserva.cantidadPersonas = Convert.ToInt32(asistentes.Value);
            newReserva.estado = Convert.ToInt32(estado.Value);
            newReserva.fechaRealizacion = Convert.ToDateTime(txtFechaRealizacion.Value);
            newReserva.fechaReserva = DateTime.Now;
            newReserva.horarealizacion = horaevento.Value;
            GenCliente clienteSelect = (GenCliente)Session["clienteSeleccionado"];
            newReserva.idCliente = clienteSelect.idCliente;
            EveEvento eventoSelect = (EveEvento)Session["eventoSeleccionado"];
            newReserva.idEvento = eventoSelect.idEvento;
            newReserva.observacion = observaciones.InnerText.ToString();
            newReserva.totalMonto = Convert.ToDecimal(total.Value);

            Session["nuevaReserva"] = newReserva;

            List<EveDetalleReserva> listaDetalles = new List<EveDetalleReserva>();
            EveEvento eventoSeleccionado = (EveEvento)Session["eventoSeleccionado"];
            foreach (EveProductoEvento item in eventoSeleccionado.Eve_Producto_evento)
            {

                //buscamos las cantidades y los subtotales
                int cantidad = 0;
                decimal subtotal = 0M;
                foreach (TableRow tr in tablaProductos.Controls)
                {
                    foreach (TableCell tc in tr.Controls)
                    {
                        if (tc.ID != null)
                        {
                            string idProduct = tc.ID.Substring(10);
                            if (item.idProducto == Convert.ToInt32(idProduct))
                            {
                                if (tc.ID != null && tc.ID.Contains("cantidadtc"))
                                {
                                    ControlCollection controles = tc.Controls;
                                    if (controles.Count > 0)
                                    {
                                        if (tc.Controls[0] is TextBox)
                                        {
                                            TextBox textBox = (TextBox)tc.Controls[0];
                                            cantidad = Convert.ToInt32(textBox.Text);
                                        }
                                    }
                                }
                                else if (tc.ID != null && tc.ID.Contains("subtotaltc"))
                                {
                                    ControlCollection controles = tc.Controls;
                                    if (controles.Count > 0)
                                    {
                                        if (tc.Controls[0] is Label)
                                        {
                                            Label label = (Label)tc.Controls[0];
                                            subtotal = Convert.ToDecimal(label.Text);
                                        }
                                    }
                                }
                            }
                        }

                    }
                }

                EveDetalleReserva detalleReserva = new EveDetalleReserva();
                detalleReserva.cantidadProducto = cantidad;
                detalleReserva.idProducto = item.idProducto;
                detalleReserva.subtotal = subtotal;
                listaDetalles.Add(detalleReserva);
            }

            Session["detallesReservaSeleccionados"] = listaDetalles;
            ClientScript.RegisterStartupScript(this.GetType(), "newWindow", String.Format("<script>window.open('{0}');</script>", "frmGenerarProforma.aspx"));
        }
    }

    public void btnGuardar_ServerClick(object sender, EventArgs e)
    {
        if (estado.Value == "3")
        {
            string confirmValue = Request.Form["confirm_value"];
            if (confirmValue == "SI")
            {
                guardarReserva();
            }
        }
        else
        {
            guardarReserva();
        }
    }


    void guardarReserva()
    {
        EveReserva eveReservaGet = (EveReserva)Session["reservaSeleccionada"];

        EveReserva eveReserva = new EveReserva();
        eveReserva.cantidadPersonas = Convert.ToInt32(asistentes.Value);
        eveReserva.estado = Convert.ToInt32(estado.Value);
        eveReserva.fechaRealizacion = Convert.ToDateTime(txtFechaRealizacion.Value);
        eveReserva.horarealizacion = horaevento.Value;
        eveReserva.totalMonto = Convert.ToDecimal(total.Value);
        eveReserva.idReserva = eveReservaGet.idReserva;
        eveReserva.IDLocal = Convert.ToInt32(selectLocal.Value);

        List<EveDetalleReserva> eveDetalleReservaList = new List<EveDetalleReserva>();
        List<EveContratoEvento> eveContratoEventoList = new List<EveContratoEvento>();

        EveEvento eventoSeleccionado = (EveEvento)Session["eventoSeleccionado"];

        foreach (EveProductoEvento item in eventoSeleccionado.Eve_Producto_evento)
        {

            //buscamos las cantidades y los subtotales
            int cantidad = 0;
            decimal subtotal = 0M;
            foreach (TableRow tr in tablaProductos.Controls)
            {
                foreach (TableCell tc in tr.Controls)
                {
                    if (tc.ID != null)
                    {
                        string idProduct = tc.ID.Substring(10);
                        if (item.idProducto == Convert.ToInt32(idProduct))
                        {

                            if (tc.ID != null && tc.ID.Contains("cantidadtc"))
                            {
                                ControlCollection controles = tc.Controls;
                                if (controles.Count > 0)
                                {
                                    if (tc.Controls[0] is TextBox)
                                    {
                                        TextBox textBox = (TextBox)tc.Controls[0];
                                        cantidad = Convert.ToInt32(textBox.Text);
                                    }
                                }
                            }
                            else if (tc.ID != null && tc.ID.Contains("subtotaltc"))
                            {
                                ControlCollection controles = tc.Controls;
                                if (controles.Count > 0)
                                {
                                    if (tc.Controls[0] is Label)
                                    {
                                        Label label = (Label)tc.Controls[0];
                                        subtotal = Convert.ToDecimal(label.Text);
                                    }
                                }
                                goto AgregarDetalle;
                            }

                        }
                    }

                }
            }

            AgregarDetalle:

            EveDetalleReserva detalleReserva = new EveDetalleReserva();//eveReserva.Eve_Detalle_reserva.Where(er => er.idProducto == item.idProducto).FirstOrDefault();
            detalleReserva.idProducto = item.idProducto;            
            detalleReserva.subtotal = subtotal;
            detalleReserva.cantidadProducto = cantidad;
            eveDetalleReservaList.Add(detalleReserva);
        }

        EveContratoEvento eveContratoEventoTMP = eveReservaGet.Eve_Contrato_evento.FirstOrDefault();
        EveContratoEvento eveContratoEvento = new EveContratoEvento();
        eveContratoEvento.estado = Convert.ToInt32(estado.Value);
        eveContratoEvento.fechaContrato = DateTime.Now;
        eveContratoEvento.idContrato = eveContratoEventoTMP.idContrato;
        eveContratoEventoList.Add(eveContratoEvento);

        eveReserva.Eve_Detalle_reserva = eveDetalleReservaList;
        eveReserva.Eve_Contrato_evento = eveContratoEventoList;
        EveReservaBLL.modificar(eveReserva);

        Session.RemoveAll();
        Response.Redirect("frmGestionarReserva.aspx");
    }

    void fillClientInformation(GenCliente modificarCliente)
    {
        nombres.Value = modificarCliente.nombre;
        telefono.Value = modificarCliente.telefono;
        fechanacimiento.Value = modificarCliente.fechaNacimiento.Value.ToString("dd/MM/yyyy");
        email.Value = modificarCliente.email;
        direccion.Value = modificarCliente.direccion;
        numerodocumento.Value = modificarCliente.NroDocumento;

    }

    void fillEventoInformation(EveEvento eventoSelected, EveReserva reservaSeleccionada)
    {
        bool inicio = !Page.IsPostBack;
        nombreevento.Value = eventoSelected.nombre;
        tipoevento.Value = eventoSelected.Eve_Tipo_evento.nombre;
        asistentes.Value = reservaSeleccionada.cantidadPersonas.Value.ToString();
        horaevento.Value = reservaSeleccionada.horarealizacion;
        txtFechaRealizacion.Value = reservaSeleccionada.fechaRealizacion.Value.ToString("dd/MM/yyyy");
        observaciones.Value = reservaSeleccionada.observacion;
        total.Value = reservaSeleccionada.totalMonto.Value.ToString("0.00");
        estado.Value = Convert.ToInt32(reservaSeleccionada.estado.Value).ToString();
        selectLocal.Value = reservaSeleccionada.IDLocal.Value.ToString();

    }

    void fillProductsInformation(EveReserva reservaSeleccionada)
    {
        bool inicio = !Page.IsPostBack;
        List<EveDetalleReserva> listaDetalles = new List<EveDetalleReserva>();
        //fill products table
        foreach (EveDetalleReserva itemTMP in reservaSeleccionada.Eve_Detalle_reserva)
        {
            decimal? montoConDescuento = itemTMP.Eve_Producto.monto - itemTMP.Eve_Producto.Eve_Producto_evento.Where(e => e.idProducto == itemTMP.idProducto).FirstOrDefault().descuento;

            TableRow tr1 = new TableRow();

            TableCell tc1 = new TableCell(); //Producto
            Label lbl1 = new Label();
            lbl1.Text = itemTMP.Eve_Producto.nombre;
            tc1.Controls.Add(lbl1);

            TableCell tc2 = new TableCell(); //Cantidad
            tc2.ID = "cantidadtc" + itemTMP.idProducto;
            TextBox txtCantidad = new TextBox();
            if (inicio)
                txtCantidad.Text = itemTMP.cantidadProducto.Value.ToString();
            else
                txtCantidad.Text = Request.Form["cantidad" + itemTMP.idProducto];
            
            txtCantidad.TextChanged += new EventHandler(txtCantidad_TextChanged);
            txtCantidad.Attributes.Add("runat", "server");
            txtCantidad.Attributes.Add("onchange", "__doPostBack('txtCantidad_TextChanged','')");
            txtCantidad.ID = "cantidad" + itemTMP.idProducto;

            tc2.Controls.Add(txtCantidad);

            TableCell tc3 = new TableCell(); //Precio Unitario
            Label lbl3 = new Label();
            lbl3.Text = montoConDescuento.Value.ToString("0.00");
            tc3.Controls.Add(lbl3);

            TableCell tc4 = new TableCell(); //Subtotal
            tc4.ID = "subtotaltc" + itemTMP.idProducto;
            Label lbl4 = new Label();
            lbl4.Attributes.Add("runat", "server");
            lbl4.ID = "subtotal" + itemTMP.idProducto;
            decimal subtotal = montoConDescuento.Value * Convert.ToInt32(txtCantidad.Text);
            lbl4.Text = subtotal.ToString("0.00");
            tc4.Controls.Add(lbl4);

            tr1.Cells.Add(tc1);
            tr1.Cells.Add(tc2);
            tr1.Cells.Add(tc3);
            tr1.Cells.Add(tc4);

            tablaProductos.Rows.Add(tr1);
        }
    }

    void txtCantidad_TextChanged(object sender, EventArgs e)
    {
        TextBox textBox = (TextBox)sender;
        int idProducto = Convert.ToInt32(textBox.ID.Replace("cantidad", ""));

        var eventoTest = Session["eventoSeleccionado"];
        EveProductoEvento eveProductoEvento = null;
        if (eventoTest != null)
        {
            EveEvento eventoObj = (EveEvento)eventoTest;
            eveProductoEvento = eventoObj.Eve_Producto_evento.Where(pe => pe.Eve_Producto.idProducto == idProducto).FirstOrDefault();
        }

        foreach (TableRow tr in tablaProductos.Controls)
        {
            foreach (TableCell tc in tr.Controls)
            {

                if (tc.ID != null && tc.ID.Contains("subtotaltc" + idProducto))
                {
                    ControlCollection controles = tc.Controls;
                    if (controles.Count > 0)
                    {
                        if (tc.Controls[0] is Label)
                        {
                            Label label = (Label)tc.Controls[0];
                            label.Text = ((eveProductoEvento.Eve_Producto.monto - eveProductoEvento.descuento) * Convert.ToInt32(textBox.Text)).ToString();

                        }
                    }
                }
            }
        }           
    }

    void persistirDatosEvento()
    {
        Session["fechaRealizacion"] = txtFechaRealizacion.Value;
        Session["horaRealizacion"] = horaevento.Value;
        Session["asistentes"] = asistentes.Value;
    }

}